/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estructurassa.controladores.ABMClasificacionProducto;

import estructurassa.controladores.ABMProducto.ModeloTablaClasificacionProductoTerminado;
import estructurassa.controladores.Controlador;
import estructurassa.controladores.ControladorPrincipal;
import estructurassa.controladores.FabricaControladores;
import estructurassa.entidades.ClasificacionProducto;
import estructurassa.entidades.CodificacionBrisch;
import estructurassa.expertos.ExpertoABMClasificacionProducto;
import estructurassa.expertos.FabricaExpertos;
import estructurassa.expertos.excepciones.ABMClasificacionProductoException;
import estructurassa.expertos.excepciones.ABMProductoTerminadoException;
import estructurassa.utiles.modeloTabla.ModeloTabla;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import newotcapp.modeloComboBox.ModeloComboGenerico;
import persistencia.exceptions.ExcepcionFachada;

/**
 *
 * @author diego
 */
public class ControladorABMClasificacionProducto implements Controlador {

    PantallaABMClasificacionProducto pantalla;
    ExpertoABMClasificacionProducto experto;
    ClasificacionProducto clasificacionSeleccionada;
    private boolean iniciado = false;
    private boolean ingresandoProductoTerminado;

    public ControladorABMClasificacionProducto() {
        pantalla = new PantallaABMClasificacionProducto();
        experto = (ExpertoABMClasificacionProducto) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.ABM_CLASIFICACION_PRODUCTO);


        pantalla.getTblClasificaciones().setModel(new ModeloTablaClasificacionProductoTerminado());
        pantalla.getTblClasificaciones().setAutoCreateRowSorter(true);
        pantalla.getTblClasificaciones().getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                seleccionarClasificacionProducto();
            }
        });

        /**
         * #######################################################################
         * #######################################################################
         * Barra herramientas
         * #######################################################################
         * #######################################################################
         */
        pantalla.getBtnNueva().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                nuevaClasificacion();
            }
        });
        pantalla.getBtnGuardar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                guardar();
            }
        });
        pantalla.getBtnBaja().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                darBaja();
            }
        });
        pantalla.getBtnSalir().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                salir();
            }
        });
    }

    public void setIngresandoProductoTerminado(boolean ingresandoProductoTerminado) {
        this.ingresandoProductoTerminado = ingresandoProductoTerminado;
    }

    @Override
    public JInternalFrame getPantalla() {
        return pantalla;
    }

    @Override
    public void iniciar() {
        pantalla.toFront();
        pantalla.setVisible(true);
        if (!iniciado) {
            ((ControladorPrincipal) FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.PRINCIPAL)).agregarPantallaInterna(pantalla);
            iniciado = true;
        }
        
        if (ingresandoProductoTerminado) {
            pantalla.getCbxTipoProducto().setModel(new ModeloComboGenerico(experto.buscarTipoProductos("4")));
            ((ModeloTabla) pantalla.getTblClasificaciones().getModel()).setListaElementos(experto.buscarClasificacionesProductos("4"));
        } else {
            pantalla.getCbxTipoProducto().setModel(new ModeloComboGenerico(experto.buscarTipoProductos("3")));
            ((ModeloTabla) pantalla.getTblClasificaciones().getModel()).setListaElementos(experto.buscarClasificacionesProductos("3"));
        }
        pantalla.getCbxTipoProducto().setSelectedIndex(1);
        pantalla.getCbxTipoProducto().setEnabled(false);
    }

    private void nuevaClasificacion() {
        clasificacionSeleccionada = null;
        pantalla.limpiarCampos();
    }

    private void seleccionarClasificacionProducto() {
        pantalla.limpiarCampos();
        int fila = pantalla.getTblClasificaciones().getSelectedRow();
        if (fila == -1) {
            return;
        }
        int filaModelo = pantalla.getTblClasificaciones().convertRowIndexToModel(fila);
        clasificacionSeleccionada = (ClasificacionProducto) ((ModeloTabla) pantalla.getTblClasificaciones().getModel()).getRow(filaModelo);
        mostrar(clasificacionSeleccionada);
    }

    private void mostrar(ClasificacionProducto clasificacion) {
        pantalla.getTxtNombre().setText(clasificacion.getNombre());
        pantalla.getTxtDescripcion().setText(clasificacion.getDescripcion());
        ((ModeloComboGenerico) pantalla.getCbxTipoProducto().getModel()).setItemSeleccionado(clasificacion.getCategoriaBrisch());
    }

    private void guardar() {
        if (clasificacionSeleccionada == null) {
            clasificacionSeleccionada = new ClasificacionProducto();
        }
        clasificacionSeleccionada.setNombre(pantalla.getTxtNombre().getText());
        clasificacionSeleccionada.setDescripcion(pantalla.getTxtDescripcion().getText());
        clasificacionSeleccionada.setCategoriaBrisch((CodificacionBrisch) ((ModeloComboGenerico) pantalla.getCbxTipoProducto().getModel()).getItemSeleccionado());
        try {
            experto.guardar(clasificacionSeleccionada);
        } catch (ABMProductoTerminadoException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            return;
        } catch (ExcepcionFachada ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR);
            return;
        }
        JOptionPane.showMessageDialog(pantalla, "Clasificación Guardada Correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        agregarClasificacionLista(clasificacionSeleccionada);
        nuevaClasificacion();
    }

    private void darBaja() {
        if (clasificacionSeleccionada == null) {
            return;
        }
        try {
            experto.darBaja(clasificacionSeleccionada);
        } catch (ABMClasificacionProductoException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        } catch (ExcepcionFachada ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR);
        }
        JOptionPane.showMessageDialog(pantalla, "Clasificación dada de baja Correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        eliminarClasificacionLista(clasificacionSeleccionada);
        nuevaClasificacion();
    }

    private void agregarClasificacionLista(ClasificacionProducto clasificacion) {
        List clasificaciones = ((ModeloTabla) pantalla.getTblClasificaciones().getModel()).getListaElementos();
        for (Object object : clasificaciones) {
            if (object.equals(clasificacion)) {
                return;
            }
        }
        ((ModeloTabla) pantalla.getTblClasificaciones().getModel()).addRow(clasificacion);
    }

    private void eliminarClasificacionLista(ClasificacionProducto clasificacion) {
        List clasificaciones = ((ModeloTabla) pantalla.getTblClasificaciones().getModel()).getListaElementos();
        for (Object object : clasificaciones) {
            if (object.equals(clasificacion)) {
                ((ModeloTabla) pantalla.getTblClasificaciones().getModel()).getListaElementos().remove(object);
                return;
            }
        }
    }

    private void salir() {
        pantalla.setVisible(false);
        if (ingresandoProductoTerminado) {
            FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.ABM_PRODUCTO_TERMINADO).iniciar();
        } else {
            FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.ABM_PRODUCTO_INTERMEDIO).iniciar();
        }

    }
}
